# 如果想要对返回的结果进行控制的话,需要自定义一个 jwt_response_payload_handler 的方法,
# 方法中接收三个参数如是 ,token ,user ,request ,
# 参数token : 生成号的token值 ,
# 参数user : 验证后的user用户对象 ,所以他可以直接调出id 和 username
# 参数request : 前端的request 对象,
# 这个方法在结果返回的时候执行,所以参数对应的数据都是已经生成好的,参数直接接收就可以
# 登录的用户都是注册好的,所以肯定有id 和 username ,
# 如此,重新指定了返回的数据
def jwt_response_payload_handler(token, user=None, request=None):

    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }









import re
from django.contrib.auth.backends import ModelBackend # 0导入此类++++++++++++++++++++++++++
from users.models import User

# 1参数request ,接收前端传来的数据,都在这里保存 ++++++++++++++++++++++++++
# 2但是参数username, password 的数据不必通过request 提取出来,他是直接获取用户名,密码进行验证的,++++++++++++++++++++
class UsernameMobileAuthBackend(ModelBackend):
    """
    自定义用户名或手机号认证
    """
    def authenticate(self, request, username=None, password=None, **kwargs):

        try: # 5因为get 获取不到会报错,所以我们try 一下,(记住此方法,可防止报错,)
            # 3先匹配手机号格式,如果匹配成功就是手机号验证登录+++++++++++++++++++++
            if re.match(r'^1[3-9]\d{9}$',username):
                user = User.objects.get(mobile=username)   # 4,导入模型类进行查询++++++++++++++++++++


            # 4如果手机格式匹配不到,就匹配用户名
            else:
                user = User.objects.get(username=username)

        except:
            user = None  # 6,如果报错,就是查不到,就是不存在,抛出user = None


        # 7,如果用户查到了,就校验密码
        # 8,使用模型类中提供的校验密码的方法,check_password
        if user is not None and user.check_password(password):
            return user # 9,校验成功返回user

        return None  # 10,校验失败返回None





















